from flask import Flask, render_template, request, session, redirect, url_for, flash
from flask_mysqldb import MySQL
from model.entity import User
from service.userservice import User, UserService  # 注意导入路径，这里假设 userservice.py 和 app.py 同级
from datetime import datetime

# 初始化 Flask 应用
app = Flask(__name__)
app.secret_key = 'your_secret_key_here'  # 用于 session 加密，生产环境需换复杂值

# 配置 MySQL 数据库连接（根据实际环境修改）
app.config['MYSQL_HOST'] = 'localhost'
app.config['MYSQL_USER'] = 'root'  # 你的数据库用户名
app.config['MYSQL_PASSWORD'] = '123456'  # 你的数据库密码
app.config['MYSQL_DB'] = 'blood_sugar'  # 你的数据库名
app.config['MYSQL_CHARSET'] = 'utf8mb4'  # 避免中文乱码

# 初始化 MySQL 连接和 UserService
mysql = MySQL(app)
# 原错误：user_service = User(mysql)
user_service = UserService(mysql)  # 改为实例化 UserService


# 注册路由
@app.route('/register', methods=['GET', 'POST'])
def register():
    if request.method == 'POST':
        username = request.form.get('username')
        password = request.form.get('password')

        if not username or not password:
            flash('用户名和密码为必填项！', 'error')
            return redirect(url_for('register'))

        # 创建 User 实体并调用注册方法
        user = User(username=username, password=password)
        if user_service.register_user(user):
            flash('注册成功，请登录', 'success')
            return redirect(url_for('login'))
        else:
            flash('注册失败，用户名可能已存在或数据库异常', 'error')
    return render_template('register.html')


# 登录路由
@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form.get('username')
        password = request.form.get('password')

        if not username or not password:
            flash('用户名和密码不能为空！', 'error')
            return redirect(url_for('login'))

        user_id = user_service.login_user(username, password)
        if user_id:
            session['user_id'] = user_id
            flash('登录成功', 'success')
            return redirect(url_for('index'))
        else:
            flash('登录失败：用户名或密码错误', 'error')
    return render_template('login.html')


# 首页路由（需登录）
@app.route('/')
@app.route('/index')
def index():
    if 'user_id' not in session:
        return redirect(url_for('login'))

    # 获取用户信息并渲染首页
    user = user_service.get_user_info(session['user_id'])
    if not user:
        flash('用户信息加载失败，请重新登录', 'error')
        return redirect(url_for('login'))
    return render_template('index.html', user=user)


# 个人信息路由（需登录，支持修改）
@app.route('/profile', methods=['GET', 'POST'])
def profile():
    if 'user_id' not in session:
        return redirect(url_for('login'))

    # 获取当前用户信息
    user = user_service.get_user_info(session['user_id'])
    if not user:
        flash('用户信息不存在', 'error')
        return redirect(url_for('index'))

    if request.method == 'POST':
        # 从表单更新用户属性（示例处理部分字段，可扩展）
        user.age = request.form.get('age', type=int)
        user.gender = request.form.get('gender')
        user.height = request.form.get('height', type=float)
        user.weight = request.form.get('weight', type=float)
        user.diabetes_type = request.form.get('diabetes_type')
        # 处理布尔类型（checkbox）
        user.hypertension = 'hypertension' in request.form
        user.smoking_history = 'smoking_history' in request.form
        user.genetic_factor = 'genetic_factor' in request.form
        user.updated_at = datetime.now()

        if user_service.update_user_info(user):
            flash('个人信息更新成功', 'success')
            return redirect(url_for('profile'))
        else:
            flash('更新失败，请检查输入或重试', 'error')

    return render_template('profile.html', user=user)


# 退出登录路由
@app.route('/logout')
def logout():
    session.pop('user_id', None)
    flash('已成功退出登录', 'info')
    return redirect(url_for('login'))


if __name__ == '__main__':
    app.run(debug=True)  # 开发环境开启调试，生产环境需调整